package ifosup.chat.contacts;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import ifosup.chat.common.IContactsCRUD;
import ifosup.chat.common.Utilisateur;


public class ContactsImplementation implements IContactsCRUD, Serializable{

	
	/**
	 * Serialisation ID
	 */
	
	private static final long serialVersionUID = 1L;
	
	private List<Utilisateur> listUtilisateurs = new ArrayList<Utilisateur>();
	private static ContactsImplementation instance  ;
	
	private ContactsImplementation() {
		super();
	    listUtilisateurs.add(new Utilisateur("192.168.13.70", "Julien"));
	    listUtilisateurs.add(new Utilisateur("192.168.13.100", "Sebastien"));
	    listUtilisateurs.add(new Utilisateur("192.168.13.40", "Matthias"));
	    listUtilisateurs.add(new Utilisateur("192.168.13.80", "Gaelle"));
	    listUtilisateurs.add(new Utilisateur("192.168.13.90", "Rodolphe"));
	    listUtilisateurs.add(new Utilisateur("192.168.13.50", "Thibault"));
	    listUtilisateurs.add(new Utilisateur("192.168.13.60", "Marie"));
	}
	
	//champ static instance ne peut etre defini qu'une seule fois, une seule reference objet... Design pattern SINGLETON
	public static ContactsImplementation getInstance() {
		if (instance == null){
//			instance =  new ContactsImplementation();
			try {
				instance = getInstanceFromFile();
			} catch (Exception e) {
				e.printStackTrace();
				instance = new ContactsImplementation();
				instance.serialiseUtilisateurs();
			}
		}
		return instance;
	}
	
	public void serialiseUtilisateurs(){
		FileOutputStream fichier;
		ObjectOutputStream oos;
		try {
			fichier = new FileOutputStream("utilisateurs.ser");
			oos = new ObjectOutputStream(fichier);
			oos.writeObject(this);
			oos.flush();
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 		
	}
	
	private static  ContactsImplementation getInstanceFromFile() throws IOException, ClassNotFoundException{
		FileInputStream fichier;
		ObjectInputStream ois;
		File f = new File("utilisateurs.ser");
		fichier = new FileInputStream(f);
		System.out.println("file exists:"+f.exists()+"  "+f.getAbsolutePath());
		ois = new ObjectInputStream(fichier);
		ContactsImplementation ci = (ContactsImplementation) ois.readObject();	
		System.out.println("nombre d'utilisateurs  "+ci.listUtilisateurs.size());
		return ci;
	}
	
	@Override
	public void add(Utilisateur utilisateur) {
		listUtilisateurs.add(utilisateur);
	}

	@Override
	public void delete(Utilisateur utilisateur) {
		listUtilisateurs.remove(utilisateur);
	}

	@Override
	public List<Utilisateur> getListUtilisateurs() {
		return this.listUtilisateurs;
	}
}
